package jmine.tec.di.wrapper;

import java.util.SortedSet;
import java.util.TreeSet;

import jmine.tec.annotations.Unmodifiable;

import org.springframework.util.comparator.ComparableComparator;

/**
 * Faz o 'wrap' para sortedSet. As classes de wrapping default devem ser acessadas pela classe {@link Wrappers}
 * 
 * @author MarceloT
 */
@Unmodifiable
class SortedSetWrapper extends AbstractCollectionWrapper implements Wrapper {
    private static final long serialVersionUID = -2463932223326792758L;

    /**
     * Wrapps varios valores
     * 
     * @param propertyKeys os nomes das propriedades
     * @param propertyValues os valores das propriedades
     * @param valueType o tipo de valor
     * @return Object
     */
    @SuppressWarnings("unchecked")
    public Object wrap(Object[] propertyKeys, Object[] propertyValues, Class<?> valueType) {
        if (Comparable.class.isAssignableFrom(valueType)) {
            SortedSet<Object> sortedSet = new TreeSet<Object>(new ComparableComparator());
            for (int i = 0; i < propertyValues.length; i++) {
                sortedSet.add(propertyValues[i]);
            }
            return sortedSet;
        }
        throw new IllegalArgumentException("property values are not comparable");
    }

    /**
     * Verifica se o tipo deste wrapper é compativel com o tipo de container passado
     * 
     * @param containerType Class
     * @return boolean
     */
    public boolean isTypeCompatible(Class<?> containerType) {
        return SortedSet.class.isAssignableFrom(containerType);
    }

}
